package tagProcessor

import (
	"reflect"
	"strings"
)

func Process[T any](data T) {
	if reflect.TypeOf(data).Kind() != reflect.Ptr {
		panic("tag handler only supports pointers")
		return
	}

	v := reflect.ValueOf(data)

	v = v.Elem()
	t := v.Type()

	//遍历每个字段
	for i := 0; i < v.NumField(); i++ {
		// 获取这个字段的tag
		tags := t.Field(i).Tag
		// 获取这个tag的所有key
		keys := GetAllKeys(tags)

		// 依次处理这个tag的所有key
		for _, key := range keys {
			handler, ok := TagHandlers[key]
			if ok {
				handler.Handle(v.Field(i), v.Type().Field(i).Tag.Get(key))
			}
		}
	}
}

// GetAllKeys 从结构体标签中获取所有键
func GetAllKeys(tags reflect.StructTag) []string {
	keys := make(map[string]struct{})

	// 将结构体标签转换为字符串
	tagString := string(tags)

	// 按空格分隔标签字符串，得到每个键值对
	pairs := strings.Fields(tagString)
	for _, pair := range pairs {
		// 按冒号分隔键和值
		parts := strings.SplitN(pair, ":", 2)
		if len(parts) == 2 {
			// 提取键并加入到结果中
			key := strings.TrimSpace(parts[0])
			keys[key] = struct{}{}
		}
	}

	// 将 map 转换为切片
	result := make([]string, 0, len(keys))
	for key := range keys {
		result = append(result, key)
	}

	return result
}
